package com.winglish.as3.exam.toeic 
{
	import com.winglish.as3.event.TossArrayEvent;
	import com.winglish.as3.exam.toeic.vo.Omr;
	import com.winglish.as3.loader.SoundGroup;
	import com.winglish.as3.utils.StringUtil;
	import com.winglish.as3.event.TossNumEvent;
	import com.winglish.as3.utils.NumberUtil;
	import flash.events.StatusEvent;
	import flash.net.LocalConnection;
	
	import flash.events.TimerEvent;
	import flash.text.TextField;
	import flash.utils.Timer;
	import flash.events.MouseEvent;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.external.ExternalInterface;
	/**
	 * ...
	 * @author charmjin
	 */
	public class ToeicOmr extends Sprite
	{
		private var dataObj:Object;
		private var mcRoot:MovieClip;
		private var partNo:int;
		private var sound:SoundGroup;
		private var _quizLen:int = 0;	//총 문제
		private var omrArr:Array = new Array();
		private var selectArr:Array = new Array();	//선택한 보기 배열
		private var dapArr:Array = new Array();	//정답 배열
		private var isLC:Boolean;
		private var curSound:int = 0;
		private var timer:Timer;
		private var timerTxt:TextField;
		private var timerType:Array = new Array();	//타이머 간격 타입(c:공통사운드, q:문제사운드)
		private var conn:LocalConnection;
		private var resultPage:Boolean = false;
		
		/**
		 * 토익 omr
		 * 
		 * LC part3,4의 경우 공통 지문 사운드도 들어간다. 문제가 2문제/3문제 또는 3문제/2문제 이런식으로 세트가 나눠들어가서.
		 * sound load : ../sound/pre_10_Cq1.mp3 (공통)
		 * sound load : ../sound/pre_10_q1.mp3
		 * sound load : ../sound/pre_10_q2.mp3
		 * sound load : ../sound/pre_10_Cq2.mp3 (공통)
		 * sound load : ../sound/pre_10_q3.mp3
		 * sound load : ../sound/pre_10_q4.mp3
		 * 사운드 플레이 순서 등은 과정에 따라 달라질 수 있으므로 확장 클래스를 사용하여 여러가지 경우를 추가해 파일명 배열을 받도록 추후 적용.
		 * @param	data
		 * @param	partNo
		 * @param	mc
		 */
		public function ToeicOmr(data:Object, no:int, mc:MovieClip) 
		{
			dataObj = data;
			mcRoot = mc;
			partNo = no;
			
			//사운드 세팅
			if (partNo <= 4) {	//LC
				isLC = true;
				swfConnection();

				var soundfile:Array = new Array();
				if (partNo >= 3) {
					soundfile.push(dataObj.common0.sound);	//첫번째 공통 지문 사운드 추가
					timerType.push("c");	//공통 사운드 타입
				}
				for (var i:uint = 0; i < dataObj.key.length; i++) {
					var str:String = String(dataObj.key[i]);
					
					if (str.indexOf("quiz") != -1 && StringUtil.replaceEmpty(dataObj[dataObj.key[i]].sound) != "") {
						soundfile.push(dataObj[dataObj.key[i]].sound);
						timerType.push("q");
					}
					if (partNo >= 3 && soundfile.length -1  == int(dataObj.setNo)) {
						soundfile.push(dataObj.common1.sound); //2번째 공통 지문 사운드 추가(세트 번호에 따라)
						timerType.push("c");
					}
				}
				sound = new SoundGroup(soundfile, dataObj.soundPath);
				sound.addEventListener("soundAllLoad", soundAllLoad);
				sound.addEventListener(TossNumEvent.TOSSNUM, soundComplete);
				sound.addEventListener(TossArrayEvent.TOSSARRAY, soundLoading);
				
				timer = new Timer(1000, ToeicData.TIMER_FIRST_SECOND);
				timer.addEventListener(TimerEvent.TIMER_COMPLETE, lcTimerComplete);
			}else {	//RC
				isLC = false;
			}
			
			try {
				ExternalInterface.addCallback("markQuestion_flash", markQuestionFlash);	// js -> flash 보기 클릭
			}catch (e:Error) {
				trace("addCallback : markQuestion_flash");
			}
			
			
			//omr 보기 셋팅
			for (i = 0; i < dataObj.key.length; i++) {
				str = String(dataObj.key[i]);
				if (str.indexOf("quiz") != -1) {
					if (StringUtil.replaceEmpty(dataObj[dataObj.key[i]].dap) != "") { 
						dapArr.push(dataObj[dataObj.key[i]].dap);
						selectArr[quizLen] = "";
						
						var omr:Omr = new Omr();
						for (var j:uint = 0; j < 4; j++) {
							omr["itemMc" + j].addEventListener(MouseEvent.CLICK, itemMcClick);
							omr["itemMc" + j].buttonMode = true;
							if (j != 0) omr["itemMc" + j].x = omr["itemMc" + (j - 1)].x + omr["itemMc" + (j - 1)].width + ToeicData.OMR_ITEM_WIDTH_GAP[partNo - 1];
							if (j == ToeicData.OMR_ITEM_CNT[(partNo - 1)]) {	//사용 안하는 보기는 가리기
								omr["itemMc" + j].visible = false;
							}
						}
						omr.btn.enabled = false;
						omr.name = "omr" + quizLen;	//0부터 시작
						omrArr.push(omr);
						omr.noTxt.text = String(omrArr.length);
						omr.x = 0;
						if (omrArr.length == 1) {
							omr.y = 0;
						}else {
							omrArr[omrArr.length - 1].y = omrArr[omrArr.length - 2].y + omrArr[omrArr.length - 2].height + ToeicData.OMR_HEIGHT_GAP;
						}
						mcRoot.addChild(omr);
						omr.mapping(mcRoot[omr.name]);
						
						_quizLen++;
					}
				}
			}
		}
		
		//로딩 이벤트 던지고

		/**
		 * 결과 보기 페이지에서 sound swf와 통신 셋팅
		 */
		private function swfConnection():void {
			conn = new LocalConnection();
			conn.client = this;
			conn.addEventListener(StatusEvent.STATUS, hnStatus);
			try {
				conn.connect("omr");
			} catch (error:ArgumentError) {
				trace("Can't connect...the connection name is already being used by another SWF");
			}
		}
		
		private function hnStatus( e:StatusEvent ): void{
			switch ( e.level ) {
				case "status":
					trace("LocalConnection.send() succeeded");
					break;
				case "error":
					trace("LocalConnection.send() failed");
					break;
			}
		}
		
		private function soundLoading(e:TossArrayEvent):void {
			dispatchEvent(new TossArrayEvent(TossArrayEvent.TOSSARRAY, true, false, e.arr));
		}
		
		
		/**
		 * sound play coomplete
		 * @param	e
		 */
		private function soundComplete(e:TossNumEvent):void {
			if (!resultPage) {	//문제 푸는 페이지에서는 사운드가 끝나면 다음 사운드 재생
				curSound++;
				if (curSound == timerType.length) return;
				
				if (timerType[curSound-1] == "c") {	//공통 지문 사운드 재생이 완료되면 바로 문제 사운드 재생
					sound.soundPlay(curSound);
				}else if (timerType[curSound-1] == "q") {	//문제 사운드 완료되면 공백 시간 타이머 시작
					timer.reset();
					timer.repeatCount = ToeicData.TIMER_SOUND_SECOND[(partNo - 1)];
					timer.start();
				}
			}else {	//결과페이지에서는 해당 사운드만 재생
				conn.send("soundSwf" + curSound, "soundStop");
			}
		}
		
		/**
		 * sound all load event
		 * @param	e
		 */
		private function soundAllLoad(e:Event):void {
			trace("all load");
			dispatchEvent(new Event("soundAllLoad"));
		}
		
		/**
		 * omr item click
		 * @param	e
		 */
		private function itemMcClick(e:MouseEvent):void {
			var no:int = int(e.target.parent.name.substr( -1));
			var no2:int = int(e.target.name.substr( -1));
			itemReset(e.target.parent);
			e.target.gotoAndStop(2);
			selectArr[no] = ToeicData.OMR_ITEM_TEXT[no2];
			
			ExternalInterface.call("markQuestion", no + 1, selectArr[no]);	
		}
		
		/**
		 * 문제 수
		 */
		public function get quizLen():int 
		{
			return _quizLen;
		}
		
		/**
		 * omr item reset
		 * @param	mc
		 */
		private function itemReset(mc:MovieClip):void {
			for (var i:uint = 0; i < ToeicData.OMR_ITEM_CNT[(partNo - 1)]; i++) {
				mc["itemMc" + i].gotoAndStop(1);
			}
		}
		
		/**
		 * omr 문제 번호 클릭 이벤트
		 * @param	e
		 */
		private function omrBtnClick(e:MouseEvent):void {
			var no:int = int(e.target.parent.name.substr( -1));
			ExternalInterface.call("moveQuestion", no + 1);
		}
		
		/**
		 * 정답 확인
		 * @return
		 */
		public function chk():Boolean {
			var isChk:Boolean = true;
			if (blank()) {
				isChk = false;
				//alert
			}else {
				timer.stop();
				if (isLC) sound.soundAllStop();
				for (var i:uint = 0; i < dapArr.length; i++) {
					var omr:Omr = omrArr[i];
					omr.btn.enabled = true;
					omr.btn.addEventListener(MouseEvent.CLICK, omrBtnClick);
					if (String(dapArr[i]).toLocaleUpperCase() == selectArr[i]) {
						omr.gotoAndStop(2);
					}else {
						omr.gotoAndStop(3);
					}
					for (var j:uint = 0; j < ToeicData.OMR_ITEM_CNT[(partNo - 1)]; j++) {
						omr["itemMc" + j].removeEventListener(MouseEvent.CLICK, itemMcClick);
						omr["itemMc" + j].buttonMode = false;
					}
				}
				try {
					ExternalInterface.call("chkQuestion");
				}catch (e:Error) {
					trace("chk");
				}
				resultPage = true;
			}
			return isChk;
		}
		
		/**
		 * 정답 모두 선택 체크
		 * @return
		 */
		private function blank():Boolean {
			var isBlank:Boolean = false;
			for (var i:uint = 0; i < dapArr.length; i++) {
				if (selectArr[i] == "") {
					isBlank = true;
					break;
				}
			}
			return isBlank;
		}
		
		/**
		 * omr 초기화
		 */
		public function omrReSet():void {
			if (isLC) { 
				sound.soundStop(curSound);
				curSound = 0;
			}else {
				timerTxt.text = "00:00";
				StringUtil.setChangeTextFormat(timerTxt, { letterSpacing: 2 } );
				timer.reset();
			}
			
			for (var i:uint = 0; i < omrArr.length; i++) {
				var omr:Omr = omrArr[i];
				omr.gotoAndStop(1);
				itemReset(omr);
				for (var j:uint = 0; j < ToeicData.OMR_ITEM_CNT[(partNo - 1)]; j++) {
					omr["itemMc" + j].addEventListener(MouseEvent.CLICK, itemMcClick);
					omr["itemMc" + j].buttonMode = true;
				}
				
				selectArr[i] = "";
			}
			
		}
		
		/**
		 * lc sound play start
		 */
		public function soundStart():void {
			timer.start();
		}
		
		/**
		 * lc sound gap timer complete
		 * @param	e
		 */
		private function lcTimerComplete(e:TimerEvent):void {
			sound.soundPlay(curSound);
		}
		
		/**
		 * 무제한 타이머 셋팅
		 * @param	txt
		 */
		public function limitTimer(txt:TextField):void {
			if (timerTxt == null) timerTxt = txt;
			timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, timerIng);
			timer.start();
		}
		
		/**
		 * timer ing event
		 * @param	e
		 */
		private function timerIng(e:TimerEvent):void {
			timerTxt.text = NumberUtil.itostr(timer.currentCount / 60) + ":" + NumberUtil.itostr(timer.currentCount % 60);
			StringUtil.setChangeTextFormat(timerTxt, { letterSpacing: 2 } );
			if (timerTxt.text == "59:59") timer.stop();
		}
		
		/**
		 * 사운드 버튼 클릭(결과보기 페이지에서 통신 flash -> flash)
		 */
		public function soundSwfPlay(no:int):void {
			sound.soundAllStop();
			sound.soundPlay(no);
			curSound = no;
			for (var i:uint = 0; i < timerType.length; i++) {
				if (no != i) conn.send("soundSwf" + i, "soundStop");
			}
			
		}
		
		/**
		 * 보기 클릭(js -> flash)
		 * @param	qNo
		 * @param	iNo
		 */
		public function markQuestionFlash(qNo:int, iNo:String):void {
			var omr:Omr = omrArr[qNo-1];
			itemReset(omr);
			omr["itemMc" + getItemIndex(iNo)].gotoAndStop(2);
			selectArr[qNo-1] = iNo.toUpperCase();
		}
		
		private function getItemIndex(str:String):int {
			var index:int;
			for (var i:uint = 0; i < ToeicData.OMR_ITEM_TEXT.length; i++) {
				if (str.toUpperCase() == ToeicData.OMR_ITEM_TEXT[i]) {
					index = i;
					break;
				}
			}
			return index;
		}
	}

}